home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyc (Python 2.6) import pygtk pygtk.require('2.0') import gtk import gtk.gdk as gtk import gtk.glade as gtk import pango import gobject import os.path as os import string import warnings warnings.filterwarnings('ignore', 'apt API not stable yet', FutureWarning) import apt import apt_pkg import os.path as os import shutil import subprocess import thread import time import gettext import sys import tempfile import pwd import grp import os from gettext import gettext as _ (LIST_LANG, LIST_LANG_INFO) = range(2) (COMBO_LANGUAGE, COMBO_CODE) = range(2) from LanguageSelector.gtk.SimpleGladeApp import SimpleGladeApp from LanguageSelector.LocaleInfo import LocaleInfo from LanguageSelector.LanguageSelector import * from LanguageSelector.ImSwitch import ImSwitch def xor(a, b): ''' helper to simplify the reading ''' return a ^ b def blockSignals(f): ''' decorator to ensure that the signals are blocked ''' def wrapper(*args, **kwargs): args[0]._blockSignals = True res = f(*args, **kwargs) args[0]._blockSignals = False return res return wrapper def honorBlockedSignals(f): ''' decorator to ensure that the signals are blocked ''' def wrapper(*args, **kwargs): if args[0]._blockSignals: return None res = f(*args, **kwargs) return res return wrapper def insensitive(f): """ decorator to ensure that a given function is run insensitive warning: this will not stack well so don't use it for nested stuff (a @insensitive func calling a @insensitve one) """ def wrapper(*args, **kwargs): args[0].setSensitive(False) res = f(*args, **kwargs) args[0].setSensitive(True) return wrapper STEPS_UPDATE_CACHE = [ 33, 66, 100] class GtkProgress(apt.OpProgress): def __init__(self, host_window, progressbar, parent, steps = STEPS_UPDATE_CACHE): self.steps = steps[:] self.base = 0 self.old = 0 self.next = int(self.steps.pop(0)) self._parent = parent self._window = host_window self._progressbar = progressbar self._window.realize() host_window.window.set_functions(gtk.gdk.FUNC_MOVE) self._window.set_transient_for(parent) def update(self, percent): self._window.show() self._parent.set_sensitive(False) if self.old > percent: self.base = self.next try: self.next = int(self.steps.pop(0)) progress = self.base + (percent / 100) * (self.next - self.base) self.old = percent self._progressbar.set_fraction(progress / 100) while gtk.events_pending(): gtk.main_iteration() def done(self): self._parent.set_sensitive(True) def hide(self): self._window.hide() class GtkLanguageSelector(LanguageSelectorBase, SimpleGladeApp): def __init__(self, datadir, options): LanguageSelectorBase.__init__(self, datadir) SimpleGladeApp.__init__(self, datadir + '/data/LanguageSelector.glade', domain = 'language-selector') self.is_admin = grp.getgrnam('admin')[2] in os.getgroups() self.has_other_users = False num = 0 for l in pwd.getpwall(): if l.pw_uid >= 500 and l.pw_uid < 65534: num += 1 if num >= 2: self.has_other_users = True break continue combo = self.combobox_system_language model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) cell = gtk.CellRendererText() combo.pack_start(cell, True) combo.add_attribute(cell, 'text', COMBO_LANGUAGE) combo.set_model(model) self.combo_syslang_dirty = False combo = self.combobox_user_language model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) cell = gtk.CellRendererText() combo.pack_start(cell, True) combo.add_attribute(cell, 'text', COMBO_LANGUAGE) combo.set_model(model) self.combo_userlang_dirty = False self.imSwitch = ImSwitch() self.options = options self._blockSignals = False self.setupTreeView() self.updateLanguageView() self.updateUserDefaultCombo() self.updateSystemDefaultCombo() self.check_input_methods() self.updateSyncButton() self.button_apply.set_sensitive(False) self.window_main.show() self.setSensitive(False) if not self._cache.havePackageLists: d = gtk.MessageDialog(parent = self.window_main, flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_CANCEL) d.set_markup('<big><b>%s</b></big>\n\n%s' % (_('No language information available'), _('The system does not have information about the available languages yet. Do you want to perform a network update to get them now? '))) d.set_title = '' d.add_button(_('_Update'), gtk.RESPONSE_YES) res = d.run() d.destroy() if res == gtk.RESPONSE_YES: self.setSensitive(False) self.update() self.updateLanguageView() self.setSensitive(True) if self.options.verify_installed: self.verifyInstalledLangPacks() if not self.imSwitch.available(): self.checkbutton_enable_input_methods.set_sensitive(False) self.setSensitive(True) def setSensitive(self, value): if value: self.window_main.set_sensitive(True) self.window_main.window.set_cursor(None) else: self.window_main.set_sensitive(False) self.window_main.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) while gtk.events_pending(): gtk.main_iteration() def runAsRoot(self, userCmd): ''' run the given command as root using gksu ''' cmd = [ '/usr/bin/gksu', '--desktop', '/usr/share/applications/language-selector.desktop', '--'] ret = subprocess.call(cmd + userCmd) return ret == 0 def updateSyncButton(self): ''' check if the sync languages button should be enabled or not ''' button = self.checkbutton_sync_languages combo = self.combobox_system_language if self.is_admin == False: button.set_active(False) button.set_sensitive(False) combo.set_sensitive(False) return None button.set_sensitive(True) combo.set_sensitive(True) userlang = self.combobox_user_language.get_active() systemlang = self.combobox_system_language.get_active() if not (self.has_other_users) and userlang == systemlang: button.set_active(True) else: button.set_active(False) updateSyncButton = blockSignals(updateSyncButton) def setupTreeView(self): ''' do all the treeview setup here ''' def toggle_cell_func(column, cell, model, iter): langInfo = model.get_value(iter, LIST_LANG_INFO) inconsistent = langInfo.inconsistent cell.set_property('active', langInfo.fullInstalled) cell.set_property('inconsistent', inconsistent) def lang_view_func(cell_layout, renderer, model, iter): langInfo = model.get_value(iter, LIST_LANG_INFO) inconsistent = langInfo.inconsistent if langInfo.changes: markup = '<b>%s</b>' % langInfo.language else: markup = '%s' % langInfo.language renderer.set_property('markup', markup) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Language'), renderer, text = LIST_LANG) column.set_property('expand', True) column.set_cell_data_func(renderer, lang_view_func) self.treeview_languages.append_column(column) renderer = gtk.CellRendererToggle() renderer.connect('toggled', self.on_toggled) column = gtk.TreeViewColumn(_('Installed'), renderer) column.set_cell_data_func(renderer, toggle_cell_func) self.treeview_languages.append_column(column) self._langlist = gtk.ListStore(str, gobject.TYPE_PYOBJECT) self.treeview_languages.set_model(self._langlist) def _get_langinfo_on_cursor(self): (path, column) = self.treeview_languages.get_cursor() if not path: return None iter = self._langlist.get_iter(path) langInfo = self._langlist.get_value(iter, LIST_LANG_INFO) return langInfo def on_checkbutton_fonts_clicked(self, button): if self.block_toggle: return None langInfo = self._get_langinfo_on_cursor() langInfo.languagePkgList['languageSupportFonts'].doChange = not (langInfo.languagePkgList['languageSupportFonts'].doChange) self.check_status() self.treeview_languages.queue_draw() def on_checkbutton_input_methods_clicked(self, button): if self.block_toggle: return None langInfo = self._get_langinfo_on_cursor() langInfo.languagePkgList['languageSupportInputMethods'].doChange = not (langInfo.languagePkgList['languageSupportInputMethods'].doChange) self.check_status() self.treeview_languages.queue_draw() def on_checkbutton_writing_aids_clicked(self, button): if self.block_toggle: return None langInfo = self._get_langinfo_on_cursor() langInfo.languagePkgList['languageSupportWritingAids'].doChange = not (langInfo.languagePkgList['languageSupportWritingAids'].doChange) self.check_status() self.treeview_languages.queue_draw() def on_checkbutton_basic_translations_clicked(self, button): if self.block_toggle: return None langInfo = self._get_langinfo_on_cursor() langInfo.languagePkgList['languagePack'].doChange = not (langInfo.languagePkgList['languagePack'].doChange) self.check_status() self.treeview_languages.queue_draw() def on_checkbutton_extra_translations_clicked(self, button): if self.block_toggle: return None langInfo = self._get_langinfo_on_cursor() langInfo.languagePkgList['languageSupportTranslations'].doChange = not (langInfo.languagePkgList['languageSupportTranslations'].doChange) self.check_status() self.treeview_languages.queue_draw() def on_checkbutton_extra_clicked(self, button): if self.block_toggle: return None langInfo = self._get_langinfo_on_cursor() langInfo.languagePkgList['languageSupportExtra'].doChange = not (langInfo.languagePkgList['languageSupportExtra'].doChange) self.check_status() self.treeview_languages.queue_draw() def on_toggled(self, renderer, path_string): ''' called when on install toggle ''' iter = self._langlist.get_iter_from_string(path_string) langInfo = self._langlist.get_value(iter, LIST_LANG_INFO) if langInfo.inconsistent: for pkg in langInfo.languagePkgList.values(): if pkg.available and not (pkg.installed): pkg.doChange = True continue elif langInfo.fullInstalled: for pkg in langInfo.languagePkgList.values(): if pkg.available: if not (pkg.installed) and pkg.doChange: pkg.doChange = False elif pkg.installed and not (pkg.doChange): pkg.doChange = True not (pkg.doChange) else: for pkg in langInfo.languagePkgList.values(): if pkg.available: if pkg.installed and pkg.doChange: pkg.doChange = False elif not (pkg.installed) and not (pkg.doChange): pkg.doChange = True not (pkg.doChange) self.check_status() self.treeview_languages.queue_draw() def on_treeview_languages_cursor_changed(self, treeview): langInfo = self._get_langinfo_on_cursor() for button, attr in (('checkbutton_basic_translations', langInfo.languagePkgList['languagePack']), ('checkbutton_extra_translations', langInfo.languagePkgList['languageSupportTranslations']), ('checkbutton_writing_aids', langInfo.languagePkgList['languageSupportWritingAids']), ('checkbutton_input_methods', langInfo.languagePkgList['languageSupportInputMethods']), ('checkbutton_extra', langInfo.languagePkgList['languageSupportExtra']), ('checkbutton_fonts', langInfo.languagePkgList['languageSupportFonts'])): self.block_toggle = True if (attr.installed or not (attr.doChange) or not (attr.installed)) and attr.doChange: getattr(self, button).set_active(True) else: getattr(self, button).set_active(False) getattr(self, button).set_sensitive(attr.available) self.block_toggle = False def on_button_install_remove_languages_clicked(self, widget): self.window_installer.show() def debug_pkg_status(self): langInfo = self._get_langinfo_on_cursor() for pkg in langInfo.languagePkgList.items(): print '%s, available: %s, installed: %s, doChange: %s' % (pkg[0], pkg[1].available, pkg[1].installed, pkg[1].doChange) print 'inconsistent? : %s' % langInfo.inconsistent def check_status(self): changed = False countInstall = 0 countRemove = 0 for lang, langInfo in self._langlist: if langInfo.changes: changed = True for item in langInfo.languagePkgList.values(): if item.doChange: if item.installed: countRemove = countRemove + 1 else: countInstall = countInstall + 1 item.installed textInstall = gettext.ngettext('%d to install', '%d to install', countInstall) % countInstall textRemove = gettext.ngettext('%d to remove', '%d to remove', countRemove) % countRemove if countRemove == 0 and countInstall == 0: self.label_install_remove.set_text('') elif countRemove == 0: self.label_install_remove.set_text(textInstall) elif countInstall == 0: self.label_install_remove.set_text(textRemove) else: self.label_install_remove.set_text(_('%s, %s') % (textInstall, textRemove)) if changed: self.button_apply.set_sensitive(True) else: self.button_apply.set_sensitive(False) def on_combobox_system_language_changed(self, widget): if self.writeSystemDefaultLang(): gdmscript = '/etc/init.d/gdm' if os.path.exists('/var/run/gdm.pid') and os.path.exists(gdmscript): self.runAsRoot([ 'invoke-rc.d', 'gdm', 'reload']) self.updateSystemDefaultCombo() if self.checkbutton_sync_languages.get_active() == True: self.combobox_user_language.set_active(self.combobox_system_language.get_active()) self.updateUserDefaultCombo() on_combobox_system_language_changed = honorBlockedSignals(insensitive(on_combobox_system_language_changed)) def on_combobox_user_language_changed(self, widget): self.check_input_methods() self.writeUserDefaultLang() self.updateUserDefaultCombo() if self.checkbutton_sync_languages.get_active() == True: self.combobox_system_language.set_active(self.combobox_user_language.get_active()) self.updateSystemDefaultCombo() on_combobox_user_language_changed = honorBlockedSignals(insensitive(on_combobox_user_language_changed)) def check_input_methods(self): ''' check if the selected langauge has input method support and set checkbutton_enable_input_methods accordingly ''' if not self.imSwitch.available(): return None combo = self.combobox_user_language model = combo.get_model() if combo.get_active() < 0: return None (lang, code) = model[combo.get_active()] active = self.imSwitch.enabledForLocale(code) self.checkbutton_enable_input_methods.set_active(active) check_input_methods = blockSignals(check_input_methods) def writeInputMethodConfig(self): ''' write new input method defaults - currently we only support all_ALL ''' combo = self.combobox_user_language model = combo.get_model() if combo.get_active() < 0: return None (lang, code) = model[combo.get_active()] new_value = self.checkbutton_enable_input_methods.get_active() if self.imSwitch.enabledForLocale(code) != new_value: if new_value: self.imSwitch.enable(code) else: self.imSwitch.disable(code) def on_checkbutton_enable_input_methods_toggled(self, widget): active = self.checkbutton_enable_input_methods.get_active() self.combo_userlang_dirty = True self.setSensitive(False) self.writeInputMethodConfig() self.setSensitive(True) on_checkbutton_enable_input_methods_toggled = honorBlockedSignals(on_checkbutton_enable_input_methods_toggled) def on_checkbutton_sync_languages_toggled(self, widget): if self.checkbutton_sync_languages.get_active() == True: self.combobox_user_language.set_active(self.combobox_system_language.get_active()) self.updateSystemDefaultCombo() on_checkbutton_sync_languages_toggled = honorBlockedSignals(on_checkbutton_sync_languages_toggled) def build_commit_lists(self): for lang, langInfo in self._langlist: self._cache.tryChangeDetails(langInfo) (to_inst, to_rm) = self._cache.getChangesList() return (to_inst, to_rm) def verify_commit_lists(self, inst_list, rm_list): ''' verify if the selected package can actually be installed ''' res = True try: for pkg in inst_list: if self._cache.has_key(pkg): self._cache[pkg].markInstall() continue for pkg in rm_list: if self._cache.has_key(pkg): self._cache[pkg].markDelete() continue except SystemError: res = False self._cache.clear() if self._cache._depcache.BrokenCount != 0: d = gtk.MessageDialog(parent = self.window_main, flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_ERROR, buttons = gtk.BUTTONS_CLOSE) d.set_markup('<big><b>%s</b></big>\n\n%s' % (_('Could not install the selected language support'), _("This is perhaps a bug of this application. Please file a bug report at https://launchpad.net/bugs/bugs/+package/ against the 'language-selector' product."))) d.set_title = '' res = d.run() d.destroy() progress = GtkProgress(self.dialog_progress, self.progressbar_cache, self.window_main) self._cache = apt.Cache(self._localeinfo, progress) progress.hide() res = False return res def commitAllChanges(self): ''' commit helper, builds the commit lists, verifies it returns the number of install/removed packages ''' self.setSensitive(False) (inst_list, rm_list) = self.build_commit_lists() if not self.verify_commit_lists(inst_list, rm_list): d = gtk.MessageDialog(parent = self.window_main, flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_ERROR, buttons = gtk.BUTTONS_CLOSE) d.set_markup('<big><b>%s</b></big>\n\n%s' % (_('Could not install the full language support'), _('Usually this is related to an error in your software archive or software manager. Check your software preferences in the menu "Adminstration".'))) d.set_title('') d.run() d.destroy() self.setSensitive(True) return 0 self.commit(inst_list, rm_list) if self.writeSystemDefaultLang(): gdmscript = '/etc/init.d/gdm' if os.path.exists('/var/run/gdm.pid') and os.path.exists(gdmscript): self.runAsRoot([ 'invoke-rc.d', 'gdm', 'reload']) self.setSensitive(True) return len(inst_list) + len(rm_list) def on_button_ok_clicked(self, widget): self.commitAllChanges() gtk.main_quit() def on_button_apply_clicked(self, widget): self.window_installer.hide() if self.commitAllChanges() > 0: self.updateLanguageView() self.updateUserDefaultCombo() self.updateSystemDefaultCombo() def _run_synaptic(self, lock, inst, rm, id): msg = _('The list of available languages on the system has been updated.') msg = msg.replace("'", "\\'") cmd = [ 'gksu', '--desktop', '/usr/share/applications/language-selector.desktop', '--', '/usr/sbin/synaptic', '--hide-main-window', '--non-interactive', '--parent-window-id', '%s' % id, '--finish-str', msg] f = tempfile.NamedTemporaryFile() cmd.append('--set-selections-file') cmd.append(f.name) for s in inst: f.write('%s\tinstall\n' % s) for s in rm: f.write('%s\tdeinstall\n' % s) f.flush() subprocess.call(cmd) lock.release() def _run_synaptic_update(self, lock, id): cmd = [ 'gksu', '--desktop', '/usr/share/applications/language-selector.desktop', '--', '/usr/sbin/synaptic', '--hide-main-window', '--parent-window-id', '%s' % id, '--non-interactive', '--update-at-startup'] subprocess.call(cmd) lock.release() def update(self): ''' update the package lists via synaptic ''' lock = thread.allocate_lock() lock.acquire() t = thread.start_new_thread(self._run_synaptic_update, (lock, self.window_main.window.xid)) while lock.locked(): while gtk.events_pending(): gtk.main_iteration() time.sleep(0.05) def commit(self, inst, rm): if len(inst) == 0 and len(rm) == 0: return None lock = thread.allocate_lock() lock.acquire() t = thread.start_new_thread(self._run_synaptic, (lock, inst, rm, self.window_main.window.xid)) while lock.locked(): while gtk.events_pending(): gtk.main_iteration() continue len(rm) == 0 time.sleep(0.05) def on_button_cancel_clicked(self, widget): self.window_installer.hide() def on_delete_event(self, event, data): if self.window_main.get_property('sensitive') is False: return True gtk.main_quit() def verifyInstalledLangPacks(self): ''' called at the start to inform about possible missing langpacks (e.g. gnome/kde langpack transition) ''' missing = self.getMissingLangPacks() if len(missing) > 0: d = gtk.MessageDialog(parent = self.window_main, flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_QUESTION) d.set_markup('<big><b>%s</b></big>\n\n%s' % (_('The language support is not installed completely'), _('Some translations or writing aids available for your chosen languages are not installed yet. Do you want to install them now?'))) d.add_buttons(_('_Remind Me Later'), gtk.RESPONSE_NO, _('_Install'), gtk.RESPONSE_YES) d.set_default_response(gtk.RESPONSE_YES) d.set_title('') expander = gtk.Expander(_('Details')) scroll = gtk.ScrolledWindow() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) textview = gtk.TextView() textview.set_cursor_visible(False) textview.set_editable(False) buf = textview.get_buffer() pkgs = '' for pkg in missing: pkgs += '%s\n' % pkg buf.set_text(pkgs) buf.place_cursor(buf.get_start_iter()) expander.add(scroll) scroll.add(textview) d.vbox.pack_start(expander) expander.show_all() res = d.run() d.destroy() if res == gtk.RESPONSE_YES: self.setSensitive(False) self.commit(missing, []) self.updateLanguageView() self.setSensitive(True) def updateLanguageView(self): self._langlist.clear() progress = GtkProgress(self.dialog_progress, self.progressbar_cache, self.window_main) try: self.openCache(progress) progress.hide() except ExceptionPkgCacheBroken: d = gtk.MessageDialog(parent = self.window_main, flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_ERROR, buttons = gtk.BUTTONS_CLOSE) d.set_markup('<big><b>%s</b></big>\n\n%s' % (_('Software database is broken'), _('It is impossible to install or remove any software. Please use the package manager "Synaptic" or run "sudo apt-get install -f" in a terminal to fix this issue at first.'))) d.set_title('') d.run() d.destroy() sys.exit(1) languageList = self._cache.getLanguageInformation() for lang in languageList: inconsistent = lang.inconsistent installed = lang.fullInstalled self._langlist.append([ _(lang.language), lang]) self._langlist.set_sort_column_id(LIST_LANG, gtk.SORT_ASCENDING) for button in ('checkbutton_basic_translations', 'checkbutton_extra_translations', 'checkbutton_writing_aids', 'checkbutton_input_methods', 'checkbutton_extra', 'checkbutton_fonts'): self.block_toggle = True getattr(self, button).set_active(False) getattr(self, button).set_sensitive(False) self.block_toggle = False def writeSystemDefaultLang(self): combo = self.combobox_system_language model = combo.get_model() if combo.get_active() < 0: return None (lang, code) = model[combo.get_active()] old_code = self._localeinfo.getDefaultLanguage() if old_code == code: return False self.setSystemDefaultLanguage(code) return True def writeUserDefaultLang(self): combo = self.combobox_user_language model = combo.get_model() if combo.get_active() < 0: return None (lang, code) = model[combo.get_active()] temp = self.getUserDefaultLanguage() if temp == None: old_code = self._localeinfo.getDefaultLanguage() else: old_code = temp.split('\\.')[0] if old_code == code: return False self.setUserDefaultLanguage(code) return True def updateSystemDefaultCombo(self): combo = self.combobox_system_language cell = combo.get_child().get_cell_renderers()[0] cell.set_property('wrap-width', 300) cell.set_property('wrap-mode', pango.WRAP_WORD) model = combo.get_model() model.clear() defaultLangName = None defaultLangCode = self.getSystemDefaultLanguage() if defaultLangCode: defaultLangName = self._localeinfo.translate(defaultLangCode) for i, locale in enumerate(self._localeinfo.generated_locales()): iter = model.append() model.set(iter, COMBO_LANGUAGE, self._localeinfo.translate(locale), COMBO_CODE, locale) if defaultLangName and self._localeinfo.translate(locale) == defaultLangName: combo.set_active(i) continue self.combo_syslang_dirty = False self.check_status() updateSystemDefaultCombo = blockSignals(updateSystemDefaultCombo) def updateUserDefaultCombo(self): combo = self.combobox_user_language cell = combo.get_child().get_cell_renderers()[0] cell.set_property('wrap-width', 300) cell.set_property('wrap-mode', pango.WRAP_WORD) model = combo.get_model() model.clear() defaultLangName = None defaultLangCode = self.getUserDefaultLanguage() if defaultLangCode == None: defaultLangCode = self.getSystemDefaultLanguage() if defaultLangCode: defaultLangName = self._localeinfo.translate(defaultLangCode) for i, locale in enumerate(self._localeinfo.generated_locales()): iter = model.append() model.set(iter, COMBO_LANGUAGE, self._localeinfo.translate(locale), COMBO_CODE, locale) if defaultLangName and self._localeinfo.translate(locale) == defaultLangName: combo.set_active(i) continue self.combo_userlang_dirty = False self.check_status() updateUserDefaultCombo = blockSignals(updateUserDefaultCombo) def on_treeview_languages_row_activated(self, treeview, path, view_column): self.on_toggled(None, str(path[0]))